Lecture 7 - Practice
Lecture 7 - Practice
1. إخراج البيانات (Output with write)
?- write('Hello'), nl.
Hello
true.
?- write(123), nl.
123
true.
?- X = 5, write('X = '), write(X), nl.
X = 5
X = 5.
?- write('Today'), write(' is '), write('great'), nl.
Today is great
true.
?- write('Result: '), write(42), nl.
Result: 42
true.
nlبيعمل new line (سطر جديد).
2. إدخال البيانات (Read Input)
go :-
write('Enter your name: '),
read(Name),
write('Hello, '), write(Name), nl.
?- go.
Enter your name: ahmed.
Hello, ahmed
true.
مهم: لازم تكتب الاسم وبعده نقطة
.لأنreadبتستنى نقطة.
3. مكعب الرقم (Cube of a Number)
cube :-
write('Enter a number: '),
read(N),
C is N * N * N,
write('Cube is '), write(C), nl.
?- cube.
Enter a number: 5.
Cube is 125
true.
?- cube.
Enter a number: -3.
Cube is -27
true.
4. مكعب الرقم بشرط التوقف (Cube with Stop Condition)
cube_stop :-
write('Enter number (0 to stop): '),
read(N),
(N =:= 0 ->
write('Goodbye!'), nl
;
C is N * N * N,
write('Cube is '), write(C), nl,
cube_stop
).
?- cube_stop.
Enter number (0 to stop): 3.
Cube is 27
Enter number (0 to stop): 4.
Cube is 64
Enter number (0 to stop): 0.
Goodbye!
true.
5. جمع رقمين (Sum of Two Numbers)
sum
sum :-
write('Enter first number: '),
read(A),
write('Enter second number: '),
read(B),
S is A + B,
write('Sum = '), write(S), nl.
sum2 (باستخدام loop)
sum2 :-
write('Enter first (0 to stop): '),
read(A),
(A =:= 0 -> write('Bye'), nl
;
write('Enter second: '),
read(B),
S is A + B,
write('Sum = '), write(S), nl,
sum2
).
?- sum.
Enter first number: 10.
Enter second number: 20.
Sum = 30
true.
6. دالة بشروط (Function with Conditions)
process :-
write('Enter X: '),
read(X),
cond(X, Y),
write('Y = '), write(Y), nl.
cond(X, Y) :-
X < 0, !,
Y is X * X.
cond(X, Y) :-
X =:= 0, !,
Y = 0.
cond(X, Y) :-
Y is X + 5.
?- process.
Enter X: -3.
Y = 9
true.
?- process.
Enter X: 0.
Y = 0
true.
?- process.
Enter X: 7.
Y = 12
true.
7. الجذر التربيعي (Square Root)
sqrt_num :-
write('Enter a number: '),
read(N),
(N < 0 ->
write('Error: negative number'), nl
;
R is sqrt(N),
write('Square root = '), write(R), nl
).
?- sqrt_num.
Enter a number: 16.
Square root = 4
true.
?- sqrt_num.
Enter a number: -5.
Error: negative number
true.
8. تقدير درجات الطلاب (Student Marks)
من غير Cut
grade(Marks) :-
Marks >= 90, write('A').
grade(Marks) :-
Marks >= 80, write('B').
grade(Marks) :-
Marks >= 70, write('C').
grade(Marks) :-
Marks >= 60, write('D').
grade(_) :-
write('F').
مشكلة: لو Marks=95:
- Rule 1: 95>=90 true → يطبع A
- يرجع backtrack ويطبع B, C, D, F كمان!
بـ Cut
grade_cut(Marks) :-
Marks >= 90, !, write('A').
grade_cut(Marks) :-
Marks >= 80, !, write('B').
grade_cut(Marks) :-
Marks >= 70, !, write('C').
grade_cut(Marks) :-
Marks >= 60, !, write('D').
grade_cut(_) :-
write('F').
?- grade_cut(85).
B
true.
?- grade_cut(95).
A
true.
?- grade_cut(55).
F
true.
الـ Cut بيأمن إنه لو أول قاعدة نجحت، ميروحش يجرب الباقي.
9. تقدير الطلاب مع الاسم (Student Marks with Name)
student_grade :-
write('Enter student name: '),
read(Name),
write('Enter marks: '),
read(Marks),
grade_cut(Marks),
write(' for '), write(Name), nl.
?- student_grade.
Enter student name: ahmed.
Enter marks: 92.
A for ahmed
true.
?- student_grade.
Enter student name: sara.
Enter marks: 73.
C for sara
true.
10. القسمة مع التحقق من الصفر (Division with Zero Check)
safe_div :-
write('Enter numerator: '),
read(A),
write('Enter denominator: '),
read(B),
(B =:= 0 ->
write('Error: division by zero'), nl
;
R is A / B,
write('Result = '), write(R), nl
).
?- safe_div.
Enter numerator: 10.
Enter denominator: 2.
Result = 5
true.
?- safe_div.
Enter numerator: 7.
Enter denominator: 0.
Error: division by zero
true.
Solution (safe_div with repeat for multiple calculations)
safe_div_loop :-
write('Enter numerator (0 to stop): '),
read(A),
(A =:= 0 -> write('Goodbye'), nl
;
write('Enter denominator: '),
read(B),
(B =:= 0 ->
write('Error: division by zero'), nl
;
R is A / B,
write('Result = '), write(R), nl
),
safe_div_loop
).